﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _027抽象类与开闭原则
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Vehicle car = new Car();
            car.Run();
        }
    }

    //抽象类 类体成员函数没有被具体实现 (不能是prvate)
    //被abstract修饰后 不可以有逻辑实现 以及实例化类

    //作用
    //1.在派生类中实现抽象类
    //2.声明变量 基类类型变量 去引用子类实例 
    //3.不稳定代码要尽可能去使用抽象类
    //4.给别的类当基类 

    //abstract class VehicleBase
    //{
    //    abstract public void Stop();
    //    abstract public void Fill();
    //    abstract public void Run();

    //}

    //相当于接口 接口包含纯抽象类的概念  这里和abstract class VehicleBase一样
    interface VehicleBase
    {
        void Stop();
        void Fill();
        void Run();
    }

    abstract class Vehicle : VehicleBase
    {
        public void Stop()
        {
            Console.WriteLine("Stopped!");

        }
        public void Fill()
        {
            Console.WriteLine("");
        }

        //可以纯虚类 不完全实现  给后面子类实现
        abstract public void Run();
    }

    class Car : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is Running");
        }
    }

    class Trunk : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Trunk is Running");
        }

    }

    class RaceCar : Vehicle
    {
        public  override void  Run()
        {
            Console.WriteLine("RaceCar is Running");
        }
    }
}
